package main

import (
	"errors"
	"fmt"
)

func f1(arg int)(int ,error){
	if arg==42{
		return -1,errors.New("can't work with 42")
	}
	return arg+3,nil
}

type argError struct {
	arg int
	prob string
}

func (e *argError) Error() string {
	return fmt.Sprintf("%d - %s",e.arg,e.prob)
}

func f2(arg int)(int ,error){
	if arg==42{
		return -1,&argError{arg,"can't work with it"}
	}
	return arg+3,nil
}
func main() {
	for _,i:=range []int{7,42}{
		if r,e:=f1(i);e!=nil{
			fmt.Println("f1 failed:",e)
		}else {
			fmt.Println("f1 worked:",r)
		}

		for _,i:=range []int{7,42}{
			if r,e:=f2(i);e!=nil{
				fmt.Println("f2 failed",e)
			}else {
				fmt.Println("f2 worked:",r)
			}
		}
	}

	_,e:=f2(42)
	if ae,ok:=e.(*argError);ok{
		fmt.Println(ae.arg)
		fmt.Println(ae.prob)
	}

}


